package api

import (
	"django_blog_gin/internal/dto"
	"django_blog_gin/internal/repository"
	"django_blog_gin/internal/svc"

	// "django_blog_gin/internal/dto"
	"django_blog_gin/internal/utils"

	"github.com/gin-gonic/gin"
)

type TagController struct {
	svcCtx *svc.ServiceContext
}

func NewTagController(svcCtx *svc.ServiceContext) *TagController {
	return &TagController{svcCtx: svcCtx}
}

func (c *TagController) GetTagList(ctx *gin.Context) {
	limit := ctx.DefaultQuery("limit", "10")
	offset := ctx.DefaultQuery("offset", "0")
	name := ctx.DefaultQuery("name", "")
	tagRepo := repository.NewTagRepo(c.svcCtx)
	tagList, total, err := tagRepo.GetTagList(limit, offset, name)
	if err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	utils.ResponseSuccess(ctx, gin.H{
		"list":  tagList,
		"total": total,
	}, "ok")
}

func (c *TagController) CreateTag(ctx *gin.Context) {
	var req dto.CretaeTagReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	tagRepo := repository.NewTagRepo(c.svcCtx)
	exist, err := tagRepo.CheckTagExist(req.Name)
	if err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	if exist {
		utils.ResponseError(ctx, 400, "tag name already exist")
		return
	}

	if err := tagRepo.CreateTag(&req); err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	utils.ResponseSuccess(ctx, nil, "ok")
}

func (c *TagController) GetTagByName(ctx *gin.Context) {
	var req dto.GetTagByName
	tagRepo := repository.NewTagRepo(c.svcCtx)
	tag, err := tagRepo.GetTagByName(req.Name)
	if err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	utils.ResponseSuccess(ctx, tag, "ok")
}

func (c *TagController) UpdateTag(ctx *gin.Context) {
	var req dto.UpdateTagReq
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	tagRepo := repository.NewTagRepo(c.svcCtx)
	exist, err := tagRepo.CheckTagExist(req.Name)
	if err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	if !exist {
		utils.ResponseError(ctx, 400, "tag name not exist")
		return
	}

	if err := tagRepo.UpdateTag(&req); err != nil {
		utils.ResponseError(ctx, 400, err.Error())
		return
	}
	utils.ResponseSuccess(ctx, nil, "ok")
}
